#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

void save(char *name, char *p_share)
{
    FILE* fp = fopen(name, "wb");
    fwrite(p_share, 1, 64, fp);
    fclose(fp);
}

int main(void)
{
    pid_t pid;

    char *p_share = (char*)malloc(64);

    pid = fork();

    sprintf(p_share, "=========hello=======");

    if(pid < 0){
        perror("create fork err");
        return 0;
    }else if(pid==0){ /* 子进程 */
        printf("[子进程] 修改前:%s %p\n", p_share, p_share); /* 共享内存空间*/
        sprintf(p_share, "=========hello1======="); /* 触发页异常中断,重新分配内存 */
        printf("[子进程] 修改后:%s %p\n", p_share, p_share); /* 共享内存空间 */

        save("child.dat", p_share);
        exit(0);
    }else{ /* 父进程 */
        printf("[父进程] 父子进程共存阶段 修改前:%s %p\n", p_share, p_share); 
        sprintf(p_share, "=========hello2======="); 
        printf("[父进程] 父子进程共存阶段 父进程修改:%s %p\n", p_share, p_share); 

        save("parent.dat", p_share);

        wait(NULL); /* 等着子进程结束 */
        printf("[父进程] 子进程结束后:%s %p\n", p_share, p_share); 
    }

    printf("------finish...\n");
    free(p_share);

    return 0;
}
